#!/bin/bash

# 构建 fcitx5-monitor deb 包的脚本
# 用法: ./build-deb.sh [构建类型]

set -e  # 遇到错误时退出

# 默认配置
DEFAULT_VERSION="1.0.21"
BUILD_TYPES=("root-python" "user-dp23")
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$SCRIPT_DIR"
OUTPUT_DIR="$SCRIPT_DIR"
VERSION_FILE="$SCRIPT_DIR/.build_version"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 显示帮助信息
show_help() {
    cat << EOF
用法: $0 [选项] [构建类型]

选项:
    -h, --help      显示此帮助信息
    -l, --list      列出可用的构建类型
    -c, --clean     清理构建产物

参数:
    构建类型        要构建的包类型 (默认: all)

示例:
    $0              # 构建所有类型，自动递增版本
    $0 nobody       # 构建 nobody 类型
    $0 -l           # 列出可用构建类型
    $0 -c           # 清理构建产物

EOF
}

# 列出可用构建类型
list_build_types() {
    echo "可用的构建类型:"
    for type in "${BUILD_TYPES[@]}"; do
        echo "  - $type"
    done
}

# 清理构建产物
clean_build() {
    log_info "清理构建产物..."
    # 只删除生成的 deb 文件
    for type in "${BUILD_TYPES[@]}"; do
        rm -f "$OUTPUT_DIR/fcitx5-monitor-deb-all-$type"_*.deb
    done
    log_info "已清理构建产物"
}

# 验证构建类型
validate_build_type() {
    local build_type=$1
    for type in "${BUILD_TYPES[@]}" "all"; do
        if [ "$type" = "$build_type" ]; then
            return 0
        fi
    done
    return 1
}

# 获取当前应该使用的版本号
get_current_version() {
    # 检查版本文件是否存在
    if [ -f "$VERSION_FILE" ]; then
        local saved_version=$(cat "$VERSION_FILE")
        # 比较保存的版本号和默认版本号，使用较大的那个
        local latest_version=$(printf '%s\n%s\n' "$saved_version" "$DEFAULT_VERSION" | sort -V | tail -n1)
        echo "$latest_version"
    else
        # 如果没有版本文件，使用默认版本
        echo "$DEFAULT_VERSION"
    fi
}

# 递增版本号
increment_version() {
    local version=$1
    
    # 解析版本号 (格式: x.y.z)
    local major=0
    local minor=0
    local patch=0
    
    # 使用正则表达式提取版本号部分
    if [[ $version =~ ^([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
        major="${BASH_REMATCH[1]}"
        minor="${BASH_REMATCH[2]}"
        patch="${BASH_REMATCH[3]}"
    else
        # 如果无法解析，返回默认版本
        echo "$DEFAULT_VERSION"
        return
    fi
    
    # 递增补丁版本号
    patch=$((patch + 1))
    
    echo "${major}.${minor}.${patch}"
}

# 保存版本号到文件
save_version() {
    local version=$1
    echo "$version" > "$VERSION_FILE"
    log_info "已保存版本号 $version 到 $VERSION_FILE"
}

# 更新版本号
update_version() {
    local deb_dir=$1
    local version=$2
    local control_file="$deb_dir/DEBIAN/control"
    local changelog_file="$deb_dir/DEBIAN/changelog"
    
    # 更新 control 文件中的版本号
    if [ -f "$control_file" ]; then
        sed -i "s/Version:.*/Version: $version/" "$control_file"
        log_info "已更新 $control_file 中的版本号为 $version"
    fi
    
    # 更新 changelog 文件（永久更新，不恢复）
    if [ -f "$changelog_file" ]; then
        # 检查是否已经存在该版本的条目
        if ! grep -q "fcitx5-monitor ($version)" "$changelog_file"; then
            # 在 changelog 文件顶部添加新版本条目
            local temp_changelog=$(mktemp)
            {
                echo "fcitx5-monitor ($version) stable; urgency=low"
                echo ""
                echo "  * 自动构建版本 $version"
                echo ""
                echo " -- 构建系统 <build@localhost>  $(date -R)"
                echo ""
                cat "$changelog_file"
            } > "$temp_changelog"
            mv "$temp_changelog" "$changelog_file"
            log_info "已更新 $changelog_file"
        else
            log_info "changelog 中已存在版本 $version，跳过更新"
        fi
    fi
}

# 更新脚本文件中的版本号
update_script_versions() {
    local deb_dir=$1
    local version=$2  # 这里应该是 $2，不是 $1
    
    # 查找并更新所有脚本文件中的版本号
    find "$deb_dir" -type f \( -name "*.sh" -o -name "*.py" \) | while read -r script_file; do
        # 检查文件是否包含版本号定义
        if grep -q "version=" "$script_file" || grep -q "VERSION=" "$script_file" || grep -q "__version__" "$script_file" || grep -q "VERSION = " "$script_file"; then
            log_info "处理脚本文件: $script_file"
            
            # 处理 Python 脚本中的格式：VERSION = "x.x.x"
            if [[ "$script_file" == *.py ]]; then
                if grep -q '^VERSION = "' "$script_file"; then
                    sed -i "s/^VERSION = \"[^\"]*\"/VERSION = \"$version\"/" "$script_file"
                    log_info "已更新 Python 脚本 $script_file 中的 VERSION = \"...\" 为 $version"
                fi
                # 处理 __version__ 变量
                if grep -q '^__version__ = "' "$script_file"; then
                    sed -i "s/^__version__ = \"[^\"]*\"/__version__ = \"$version\"/" "$script_file"
                    log_info "已更新 Python 脚本 $script_file 中的 __version__ 为 $version"
                fi
            fi
            
            # 处理 Shell 脚本中的格式
            if [[ "$script_file" == *.sh ]]; then
                # 处理正常格式：VERSION="x.x.x"
                if grep -q '^VERSION="' "$script_file"; then
                    sed -i "s/^VERSION=\"[^\"]*\"/VERSION=\"$version\"/" "$script_file"
                    log_info "已更新 Shell 脚本 $script_file 中的 VERSION=\"...\" 为 $version"
                fi
                # 处理错误格式：VERSION=1.0.30"1.0.30"
                if grep -q '^VERSION=[0-9.]*"' "$script_file"; then
                    sed -i "s/^VERSION=[0-9.]*\"[0-9.]*\"/VERSION=\"$version\"/" "$script_file"
                    log_info "已更新 Shell 脚本 $script_file 中的错误格式 VERSION 为 $version"
                fi
                # 处理不带引号的格式：VERSION=1.0.30
                if grep -q '^VERSION=[0-9.]*$' "$script_file"; then
                    sed -i "s/^VERSION=[0-9.]*$/VERSION=$version/" "$script_file"
                    log_info "已更新 Shell 脚本 $script_file 中的 VERSION=... 为 $version"
                fi
            fi
        fi
    done
    
    # 特别处理：将 usr/local/bin/fcitx5-monitor.sh 同步到 etc/skel/.local/bin/fcitx5-monitor.sh
    local source_script="$deb_dir/usr/local/bin/fcitx5-monitor.sh"
    local target_script="$deb_dir/etc/skel/.local/bin/fcitx5-monitor.sh"
    
    if [ -f "$source_script" ] && [ -f "$target_script" ]; then
        log_info "同步 fcitx5-monitor.sh 文件..."
        # 复制文件内容
        cp "$source_script" "$target_script"
        # 更新目标文件中的版本号
        if grep -q '^VERSION="' "$target_script"; then
            sed -i "s/^VERSION=\"[^\"]*\"/VERSION=\"$version\"/" "$target_script"
        fi
        log_info "已将 $source_script 同步到 $target_script 并更新版本号"
    elif [ -f "$source_script" ] && [ ! -f "$target_script" ]; then
        log_info "创建目标目录并同步 fcitx5-monitor.sh 文件..."
        mkdir -p "$(dirname "$target_script")"
        cp "$source_script" "$target_script"
        # 更新目标文件中的版本号
        if grep -q '^VERSION="' "$target_script"; then
            sed -i "s/^VERSION=\"[^\"]*\"/VERSION=\"$version\"/" "$target_script"
        fi
        log_info "已创建 $target_script 并同步内容及版本号"
    fi
}

# 构建单个包
build_package() {
    local build_type=$1
    local version=$2
    local source_dir="$PROJECT_ROOT/fcitx5-monitor-deb-all-$build_type*"
    local source_pkg_dir=$(ls -d $source_dir 2>/dev/null | head -n 1)
    
    if [ -z "$source_pkg_dir" ] || [ ! -d "$source_pkg_dir" ]; then
        log_error "未找到构建类型 '$build_type' 的源目录: $source_dir"
        return 1
    fi
    
    local pkg_name="fcitx5-monitor-deb-all-$build_type"
    local output_file="$OUTPUT_DIR/${pkg_name}_$version.deb"
    
    log_info "开始构建 $build_type 类型包 (版本: $version)"
    
    # 更新版本号（直接在源目录中更新）
    update_version "$source_pkg_dir" "$version"
    
    # 更新脚本文件中的版本号（永久更新，不恢复）
    update_script_versions "$source_pkg_dir" "$version"
    
    # 确保脚本具有可执行权限
    find "$source_pkg_dir" -name "*.sh" -exec chmod +x {} \;
    find "$source_pkg_dir" -name "*.py" -exec chmod +x {} \;
    
    # 计算安装大小（可选）
    local installed_size=$(du -sk "$source_pkg_dir" | cut -f1)
    sed -i "s/Installed-Size:.*/Installed-Size: $installed_size/" "$source_pkg_dir/DEBIAN/control" 2>/dev/null || true
    
    # 构建deb包
    log_info "正在构建deb包: $output_file"
    dpkg-deb --build "$source_pkg_dir" "$output_file"
    
    if [ -f "$output_file" ]; then
        log_info "成功构建: $output_file"
        # 显示包信息
        dpkg-deb --info "$output_file"
    else
        log_error "构建失败: $output_file"
        return 1
    fi
}

# 主构建函数
build_all() {
    local build_type=$1
    
    # 获取当前应该使用的版本号
    local current_version=$(get_current_version)
    
    log_info "开始构建 fcitx5-monitor 包"
    log_info "基线版本: $DEFAULT_VERSION"
    log_info "使用版本: $current_version"
    log_info "构建类型: $build_type"
    
    # 构建包
    if [ "$build_type" = "all" ]; then
        for type in "${BUILD_TYPES[@]}"; do
            build_package "$type" "$current_version" || return 1
        done
    else
        build_package "$build_type" "$current_version" || return 1
    fi
    
    # 递增版本号并保存
    local next_version=$(increment_version "$current_version")
    save_version "$next_version"
    log_info "版本号已递增并保存为: $next_version"
    
    log_info "所有包构建完成，输出目录: $OUTPUT_DIR"
}

# 主程序
main() {
    local version=""  # 不再使用 DEFAULT_VERSION 作为默认值
    local build_type="all"
    local clean_only=false
    local list_only=false
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -l|--list)
                list_only=true
                shift
                ;;
            -c|--clean)
                clean_only=true
                shift
                ;;
            -*)
                log_error "未知选项: $1"
                show_help
                exit 1
                ;;
            *)
                break
                ;;
        esac
    done
    
    # 处理列表选项
    if [ "$list_only" = true ]; then
        list_build_types
        exit 0
    fi
    
    # 处理清理选项
    if [ "$clean_only" = true ]; then
        clean_build
        exit 0
    fi
    
    # 解析剩余参数
    if [ $# -ge 1 ]; then
        build_type="$1"
        if ! validate_build_type "$build_type"; then
            log_error "无效的构建类型: $build_type"
            list_build_types
            exit 1
        fi
    fi
    
    # 检查必要工具
    for tool in dpkg-deb; do
        if ! command -v $tool &> /dev/null; then
            log_error "缺少必要工具: $tool"
            exit 1
        fi
    done
    
    # 执行构建
    build_all "$build_type"
}

# 执行主程序
main "$@"
